package com.topnav.mc.config;

import com.topnav.mc.listener.*;
import com.topnav.mc.uitls.FastJsonRedisSerializer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * @Author: kenny
 * @Date: 2023/10/10 17:56
 */
@Configuration
public class RedisConfig1 extends CachingConfigurerSupport {
    @Autowired
    private RedisGpsMsgListener redisGpsMsgListener;
    @Autowired
    private RedisAlarmMsgListener redisAlarmMsgListener;
    @Autowired
    private RedisYlDeviceInfoMsgListener redisYlDeviceInfoMsgListener;
    @Autowired
    private RedisDeviceOnlineListener redisDeviceOnlineListener;
    @Autowired
    private RedisDeviceKeepaliveListener redisDeviceKeepaliveListener;
    @Autowired
    private OtherCommMessageListener otherCommMessageListener;

    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        // 使用fastJson序列化
        FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(Object.class);
        // value值的序列化采用fastJsonRedisSerializer
        redisTemplate.setValueSerializer(fastJsonRedisSerializer);
        redisTemplate.setHashValueSerializer(fastJsonRedisSerializer);

        // key的序列化采用StringRedisSerializer
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        return redisTemplate;
    }

    /**
     * redis消息监听器容器 可以添加多个监听不同话题的redis监听器，只需要把消息监听器和相应的消息订阅处理器绑定，该消息监听器
     * 通过反射技术调用消息订阅处理器的相关方法进行一些业务处理
     *
     * @param connectionFactory
     * @return
     */
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {

        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        //container.addMessageListener(redisGpsMsgListener, new PatternTopic("VM_MSG_GPS"));
        container.addMessageListener(redisGpsMsgListener, new PatternTopic("mobileposition"));
        container.addMessageListener(redisAlarmMsgListener, new PatternTopic("device_sos_alarm"));
        container.addMessageListener(redisYlDeviceInfoMsgListener, new PatternTopic("YLDeviceInfo"));
        container.addMessageListener(redisDeviceOnlineListener, new PatternTopic("DEVICE-ONLINE-OFFLINE"));
        container.addMessageListener(redisDeviceKeepaliveListener, new PatternTopic("DEVICE-KEEPALIVE"));
        container.addMessageListener(otherCommMessageListener, new PatternTopic("NOTIFY_OTHER_COMMON_MESSAGE"));

        //
        //container.addMessageListener(redisStreamMsgListener, new PatternTopic(VideoManagerConstants.WVP_MSG_STREAM_CHANGE_PREFIX + "PUSH"));
        //container.addMessageListener(redisGbPlayMsgListener, new PatternTopic(RedisGbPlayMsgListener.WVP_PUSH_STREAM_KEY));
        //container.addMessageListener(redisPushStreamStatusMsgListener, new PatternTopic(VideoManagerConstants.VM_MSG_PUSH_STREAM_STATUS_CHANGE));
        //container.addMessageListener(redisPushStreamListMsgListener, new PatternTopic(VideoManagerConstants.VM_MSG_PUSH_STREAM_LIST_CHANGE));
        //container.addMessageListener(redisPushStreamResponseListener, new PatternTopic(VideoManagerConstants.VM_MSG_STREAM_PUSH_RESPONSE));
        return container;
    }
}
